
#include <iostream>
#include <stdlib.h>
#include <fstream>


#include "../common/Argv.h"
#include "../common/ArchivoIni.h"
#include "../common/StringUtils.h"
#include "../logger/logger.h"
#include "../channel_common/ChannelCommon.h"
#include "../IPC/Sequence.h"
#include "../IPC/ClientSocket.h"
#include "../IPC/ServerSocket.h"
#include "../IPC/ProcessAux.h"

int main(int argc, char **argv)
{
	CLogger::create("Servidor Salida Broker");
	char buffer[TAM_BUFFER];
	int puertoSalida = 0;
	ipc::ServerSocket socketSalidaPasivo;
	//socket conectado al cliente
	int	socketSalida;

	//Toma argumentos (main)
	Argv args(argv);

	if (args.getArgc() != 2)
	{
		std::cout <<"Servidor Entrada Broker Error: Cantidad de parametros invalida."<<std::endl;
		exit(1);
	}

	std::string brokerName= args.getArg(1);

	MapaIni config = ArchivoIni::parsearComoIni("brokers.ini");

	if(config[brokerName] == "")
	{
		CLogger::log("Broker configuration not found in brokers.ini",LogLevelEnum::FATAL);
		exit(1);
	}

	std::vector<std::string> brokerParams= StringUtils::splitString(config[brokerName],'|');

	if(brokerParams.size()<4)
	{
		CLogger::log("Malformed params",LogLevelEnum::FATAL);
		exit(1);
	}

	puertoSalida = StringUtils::StringToNumber<int>(brokerParams[3]);

	CLogger::log("Levantando server:  en puerto salida "
			+ StringUtils::NumberToString(puertoSalida),
			LogLevelEnum::INFO);


	socketSalidaPasivo.listen(puertoSalida,5);
	
	CLogger::log("Se hizo el open pasivo, socket  "+ StringUtils::NumberToString(puertoSalida),
			LogLevelEnum::INFO);

	while (true)
	{
		//Creo el client socket con el resultado del accept
		ipc::ClientSocket socketSalida(socketSalidaPasivo.accept());

		CLogger::log("Se conecto un cliente al socket  "+ StringUtils::NumberToString(socketSalida.getFd()),
				LogLevelEnum::INFO);

		Argv args;
		args.pushArg(StringUtils::NumberToString(socketSalida.getFd()));
		args.pushArg(StringUtils::NumberToString(brokerName));

		ProcessAux::launchProcess("./out/channel_out_broker",1,args.getArgv());

		socketSalida.close();
	}
	return 0;
}
